package com.example.crm.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Utils {


    // ThreadLocal
    // 每个线程 是独立
    // 一个线程内的 放入和取出 得到的是同一个对象
    // 另外一个线程 放入和取出 得到的是另外一个对象
    private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();

    /**
     * 连接池
     */
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource();

    /**
     * 获取数据库连接
     *
     * @return
     * @throws SQLException
     */
    public static DataSource getDataSource() throws SQLException {
        return dataSource;
    }

    /**
     * 获取数据库连接
     *
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException
    {
        // 获取连接，如果ThreadLocal已有了
        Connection con = tl.get();
        if (con == null) {
            con = dataSource.getConnection();
            tl.set(con);
        }
        return con;
    }

    // D E  F

    // A  B  C

    // 1号车  2号车

    /**
     * 释放资源
     *
     * @param conn 需要释放的连接
     * @param stmt 需要释放的查询对象
     * @param rs   需要释放的结果集
     */
    public static void destoryResource(Connection conn, Statement stmt, ResultSet rs) {
        // 释放结果集
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        // 释放查询对象
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        // 释放连接
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    // 开启事务
    public static void startTransaction() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            // 取消自动提交
            con.setAutoCommit(false);
        }
    }

    // 事务回滚
    public static void rollback() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.rollback();
        }
    }

    // 提交并且 关闭资源及从ThreadLocall中释放
    public static void commitAndRelease() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.commit(); // 事务提交
            con.close();// 关闭资源
            tl.remove();// 从线程绑定中移除
        }
    }

    // 关闭资源方法
    public static void closeConnection() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.close();
        }
    }

    public static void closeStatement(Statement st) throws SQLException {
        if (st != null) {
            st.close();
        }
    }

    public static void closeResultSet(ResultSet rs) throws SQLException {
        if (rs != null) {
            rs.close();
        }
    }
}